// #ifdef H5 || APP-PLUS || MP-TOUTIAO
// 引入js加密
import CryptoJS from "crypto-js";
// 加密随便写的key
const secretKey = "abcdefghijklmnopqrstuvwxyz";
// #endif

// #ifdef H5 || APP-PLUS || MP-TOUTIAO
/**
 * 加密方法
 * @param value
 * @returns {string}
 */
function encrypt(value) {
    // 进行AES加密
    return CryptoJS.AES.encrypt(value, secretKey).toString() || "";
}

/**
 * 解密方法
 * @param value
 * @returns {string}
 */
function decrypt(value) {
    if (!value) return "";
    // 进行AES解密
    const bytes = CryptoJS.AES.decrypt(value, secretKey) || "";
    const originalText = bytes.toString(CryptoJS.enc.Utf8) || null;
    return JSON.parse(originalText);
}
// #endif

/**
 * @description 检测数据类型
 * @param target 检测的目标
 * @returns {string}
 */
function checkType(target) {
    return Object.prototype.toString
        .call(target)
        .slice(8, -1)
        .toLowerCase();
}

/**
 * @description 同步加密并设置缓存数据
 * @param key 缓存的key值
 * @param value 缓存的value值
 */
export function setStorageSync(key, value) {
    try {
        // json序列化
        value = JSON.stringify(value ?? "");
        // #ifdef H5 || APP-PLUS || MP-TOUTIAO
        // 进行AES加密
        const encryptValue = encrypt(value);
        // 进行数据缓存
        uni.setStorageSync(key, encryptValue);
        // #endif
        // #ifndef H5 || APP-PLUS || MP-TOUTIAO
        // 进行数据缓存
        uni.setStorageSync(key, value);
        // #endif
    } catch (err) {
        console.log("同步加密并设置缓存数据失败", err);
    }
}

/**
 * @description 同步解密并获取缓存数据
 * @param key 缓存的key值
 * @returns {string|any}
 */
export function getStorageSync(key) {
    try {
        // 获取数据缓存
        const value = uni.getStorageSync(key);
        if (!value) return "";
        // #ifdef H5 || APP-PLUS || MP-TOUTIAO
        return decrypt(value);
        // #endif
        // #ifndef H5 || APP-PLUS || MP-TOUTIAO
        // 解析json
        return JSON.parse(value);
        // #endif
    } catch (err) {
        console.log("同步解密并获取缓存数据失败", err);
        return "";
    }
}

/**
 * @description 对url参数进行加密并编码
 * @param data 需要加密并编码的url参数
 * @returns {string}
 */
export function encodeUrlParams(data) {
    // json序列化
    data = JSON.stringify(data || "");
    // #ifdef H5 || APP-PLUS || MP-TOUTIAO
    // 进行AES加密
    const encryptValue = encrypt(data);
    // AES加密后在进行参数编码
    return encodeURIComponent(encryptValue);
    // #endif
    // #ifndef H5 || APP-PLUS || MP-TOUTIAO
    // 进行参数编码
    return encodeURIComponent(data);
    // #endif
}

/**
 * @description 对url参数进行解密并解码
 * @param data 需要解密并解码的url参数
 * @returns {any}
 */
export function decodeUrlParams(data) {
    try {
        // url参数先解码
        data = decodeURIComponent(data);
        // #ifdef H5 || APP-PLUS || MP-TOUTIAO
        // 进行AES解密
        return decrypt(data);
        // #endif
        // #ifndef H5 || APP-PLUS || MP-TOUTIAO
        // 解析json
        return JSON.parse(data);
        // #endif
    } catch (err) {
        console.log("解密并解码URL出错", err);
        return "";
    }
}

/**
 * @description 页面传递参数
 * @param data 传递的参数
 * @returns {string}
 */
export function sendMsg(data) {
    const type = checkType(data);
    switch (type) {
        case "object":
            return Object.keys(data).length > 0
                ? encodeUrlParams(data)
                : encodeUrlParams({});
        case "array":
            return data.length > 0 ? encodeUrlParams(data) : encodeUrlParams([]);
        case "string":
        case "number":
        case "boolean":
            return encodeUrlParams(data);
        default:
            return encodeUrlParams("");
    }
}

/**
 * @description 页面获取参数
 * @param data 获取的参数
 * @returns {any}
 */
export function getMsg(data) {
    return decodeUrlParams(data);
}
